From ede6f2ab59021d56329c4f9f85ced8fe26134f8a Mon Sep 17 00:00:00 2001 From: =?utf8?q?Timm=20B=C3=A4der?= Date: Fri, 5 May 2017 14:06:01 +0200 Subject: [PATCH] Slightly rework clip handling always initialize clips to the (content) allocation, don't walk up the widget hierarchy in gtk_widget_set_clip, implement gtk_widget_size_allocate in GtkSeparator. This way we don't end up using uninitialized clip values. The entire clip handling is up for major rework since we can't and don't want to force every single widget to call _set_clip in size-allocate implementations. --- gtk/gtkactionbar.c | 2 +- gtk/gtkcheckbutton.c | 2 +- gtk/gtkcombobox.c | 2 +- gtk/gtkgrid.c | 2 +- gtk/gtkicon.c | 2 +- gtk/gtklevelbar.c | 4 +--- gtk/gtknotebook.c | 4 +--- gtk/gtkseparator.c | 9 +++++++++ gtk/gtkspinbutton.c | 2 +- gtk/gtkstack.c | 4 +--- gtk/gtkwidget.c | 19 +------------------ 11 files changed, 19 insertions(+), 33 deletions(-) diff --git a/gtk/gtkactionbar.c b/gtk/gtkactionbar.c index 537a319ae1..c645769f2e 100644 --- a/gtk/gtkactionbar.c +++ b/gtk/gtkactionbar.c @@ -272,7 +272,7 @@ gtk_action_bar_size_allocate (GtkWidget *widget, GtkAllocation *allocation) { GtkActionBarPrivate *priv = gtk_action_bar_get_instance_private (GTK_ACTION_BAR (widget)); - GtkAllocation clip; + GtkAllocation clip = *allocation; gtk_widget_size_allocate (priv->revealer, (GtkAllocation *)allocation); gtk_widget_get_clip (priv->revealer, &clip); diff --git a/gtk/gtkcheckbutton.c b/gtk/gtkcheckbutton.c index 691b740d0d..3b3c52b61e 100644 --- a/gtk/gtkcheckbutton.c +++ b/gtk/gtkcheckbutton.c @@ -415,7 +415,7 @@ gtk_check_button_size_allocate (GtkWidget *widget, GtkAllocation *allocation) { GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (GTK_CHECK_BUTTON (widget)); - GdkRectangle clip; + GdkRectangle clip = *allocation; if (priv->draw_indicator) { diff --git a/gtk/gtkcombobox.c b/gtk/gtkcombobox.c index b367b0a7e8..f5c7ce4a04 100644 --- a/gtk/gtkcombobox.c +++ b/gtk/gtkcombobox.c @@ -372,7 +372,7 @@ gtk_combo_box_size_allocate (GtkWidget *widget, { GtkComboBox *combo_box = GTK_COMBO_BOX (widget); GtkComboBoxPrivate *priv = combo_box->priv; - GtkAllocation clip; + GtkAllocation clip = *allocation; gtk_widget_size_allocate_with_baseline (priv->box, allocation, gtk_widget_get_allocated_baseline (widget)); diff --git a/gtk/gtkgrid.c b/gtk/gtkgrid.c index f41054ae3b..937f3bb4ff 100644 --- a/gtk/gtkgrid.c +++ b/gtk/gtkgrid.c @@ -1588,7 +1588,7 @@ gtk_grid_size_allocate (GtkWidget *widget, GtkAllocation *allocation) { GtkAllocation clip = *allocation; - GtkAllocation children_clip; + GtkAllocation children_clip = *allocation; GtkGrid *grid = GTK_GRID (widget); GtkGridPrivate *priv = grid->priv; GtkGridRequest request; diff --git a/gtk/gtkicon.c b/gtk/gtkicon.c index c22c071c31..1ea9fd3ec5 100644 --- a/gtk/gtkicon.c +++ b/gtk/gtkicon.c @@ -118,7 +118,7 @@ gtk_icon_size_allocate (GtkWidget *widget, { GtkIcon *self = GTK_ICON (widget); GtkIconPrivate *priv = gtk_icon_get_instance_private (self); - GtkAllocation clip; + GtkAllocation clip = *allocation; gtk_css_gadget_allocate (priv->gadget, allocation, gtk_widget_get_allocated_baseline (widget), diff --git a/gtk/gtklevelbar.c b/gtk/gtklevelbar.c index 6cc32e4e54..077ea00ec5 100644 --- a/gtk/gtklevelbar.c +++ b/gtk/gtklevelbar.c @@ -534,9 +534,7 @@ gtk_level_bar_size_allocate (GtkWidget *widget, GtkAllocation *allocation) { GtkLevelBarPrivate *priv = gtk_level_bar_get_instance_private (GTK_LEVEL_BAR (widget)); - GtkAllocation clip; - - GTK_WIDGET_CLASS (gtk_level_bar_parent_class)->size_allocate (widget, allocation); + GtkAllocation clip = *allocation; gtk_widget_size_allocate (priv->trough_widget, allocation); gtk_widget_get_clip (priv->trough_widget, &clip); diff --git a/gtk/gtknotebook.c b/gtk/gtknotebook.c index 9073f81b14..13b4e81a6f 100644 --- a/gtk/gtknotebook.c +++ b/gtk/gtknotebook.c @@ -2264,9 +2264,7 @@ gtk_notebook_size_allocate (GtkWidget *widget, { GtkNotebook *notebook = GTK_NOTEBOOK (widget); GtkNotebookPrivate *priv = notebook->priv; - GtkAllocation clip; - - gtk_widget_set_allocation (widget, allocation); + GtkAllocation clip = *allocation; gtk_css_gadget_allocate (priv->gadget, allocation, diff --git a/gtk/gtkseparator.c b/gtk/gtkseparator.c index ebb2f50702..5306b8e95b 100644 --- a/gtk/gtkseparator.c +++ b/gtk/gtkseparator.c @@ -123,12 +123,21 @@ gtk_separator_init (GtkSeparator *separator) _gtk_orientable_set_style_classes (GTK_ORIENTABLE (separator)); } +static void +gtk_separator_size_allocate (GtkWidget *widget, + GtkAllocation *allocation) +{ + gtk_widget_set_clip (widget, allocation); +} + static void gtk_separator_class_init (GtkSeparatorClass *class) { GObjectClass *object_class = G_OBJECT_CLASS (class); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class); + widget_class->size_allocate = gtk_separator_size_allocate; + object_class->set_property = gtk_separator_set_property; object_class->get_property = gtk_separator_get_property; diff --git a/gtk/gtkspinbutton.c b/gtk/gtkspinbutton.c index a105a3a6d8..f8ba5d04e6 100644 --- a/gtk/gtkspinbutton.c +++ b/gtk/gtkspinbutton.c @@ -1057,7 +1057,7 @@ gtk_spin_button_size_allocate (GtkWidget *widget, GtkAllocation *allocation) { GtkSpinButtonPrivate *priv = gtk_spin_button_get_instance_private (GTK_SPIN_BUTTON (widget)); - GtkAllocation clip; + GtkAllocation clip = *allocation; gtk_widget_size_allocate_with_baseline (priv->box, allocation, gtk_widget_get_allocated_baseline (widget)); diff --git a/gtk/gtkstack.c b/gtk/gtkstack.c index 4a0d6f9115..8b9d160a0a 100644 --- a/gtk/gtkstack.c +++ b/gtk/gtkstack.c @@ -2120,9 +2120,7 @@ gtk_stack_size_allocate (GtkWidget *widget, { GtkStack *stack = GTK_STACK (widget); GtkStackPrivate *priv = gtk_stack_get_instance_private (stack); - GtkAllocation clip; - - gtk_widget_set_allocation (widget, allocation); + GtkAllocation clip = *allocation; gtk_css_gadget_allocate (priv->gadget, allocation, diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 64cbcf17a6..ea8fa4c153 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -3853,6 +3853,7 @@ gtk_widget_init (GTypeInstance *instance, gpointer g_class) priv->allocation.y = -1; priv->allocation.width = 1; priv->allocation.height = 1; + priv->clip = priv->allocation; priv->user_alpha = 255; priv->alpha = 255; priv->window = NULL; @@ -13488,24 +13489,6 @@ gtk_widget_set_clip (GtkWidget *widget, allocation.width += shadow.left + shadow.right; allocation.height += shadow.top + shadow.bottom; gdk_rectangle_union (&allocation, clip, &priv->clip); - - - while (priv->parent && - _gtk_widget_get_window (widget) == _gtk_widget_get_window (priv->parent)) - { - GtkWidgetPrivate *parent_priv = priv->parent->priv; - GdkRectangle union_rect; - - gdk_rectangle_union (&priv->clip, - &parent_priv->clip, - &union_rect); - - if (gdk_rectangle_equal (&parent_priv->clip, &union_rect)) - break; - - parent_priv->clip = union_rect; - priv = parent_priv; - } } /* -- 2.30.2